package gvo.util;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HtmlToUTF {
	// \\u5B66
	 private static final HashMap<Integer, String> NUM = new HashMap<Integer, String>();
	 private static final HashMap<String, String> STR = new HashMap<String, String>();
	 private static final String REGEX_CH = "&.+?;";
	 public static final String REGEX_TAG = "<.+?>";
	 public static final String REGEX_MARC = "\\$.+? "; // sollte nur ein \ sein! Funktioniert das?
	public HtmlToUTF() {
		//createNum();
		createStr();
	}
	public static String replacePattern(String in, String regex, String repl){
		Pattern p =  Pattern.compile(regex);
		Matcher m = p.matcher(in);
		StringBuffer sb = new StringBuffer();
		while(m.find()){
			m.appendReplacement(sb,repl);
		}
		m.appendTail(sb);
		return sb.toString();
	}
	public static String convertMcTagsToString(String in){
		Pattern p =  Pattern.compile(REGEX_MARC);
		Matcher m = p.matcher(in);
		StringBuffer sb = new StringBuffer();
		//String found;
		String repl = "";
		while(m.find()){
			//String match = m.group();
			//found =match.substring(1, match.length()-1);
			m.appendReplacement(sb,repl);
		}
		m.appendTail(sb);
		return (sb.toString()).trim();
	}
	public String convertHtmltoText(String in){
		Pattern p =  Pattern.compile(REGEX_CH);
		Matcher m = p.matcher(in);
		StringBuffer sb = new StringBuffer();
		String found, repl;
	        //int start, end, lenAll;
	        //lenAll = in.length();
		while(m.find()){
	        	//start = m.start();
	        	//end = m.end();
			String match = m.group();
	        	//System.out.println("A:"+lenAll+" S:"+start+" E:"+end);
			if(match.charAt(1) == '#'){
				found =match.substring(2, match.length()-1);
				repl = getUniCodeForNumber(found);
			} else {
				found =match.substring(1, match.length()-1);
				repl = getUniCodeForStr(found);
			}
	        	//System.out.println("MATCHER: f="+found +" r="+repl);
			m.appendReplacement(sb,repl);
		}
		m.appendTail(sb);
		
		return sb.toString();
	}
	public String getUniCodeForNumber(String number){
		char huep;
		try { 
			huep = (char)(Integer.valueOf(number).intValue());
		} catch (Exception e) {
			huep = ' ';
			e.printStackTrace();
		}
		return "" + huep;
	}
	public String getUniCodeForStr(String html){
		//System.out.println("MATCHER: "+ html);
		String res = STR.get(html);
		//System.out.println("STR ="+res);
		return res ;
	}
	public static String intToHexString(int zahl){
		return String.format("%1$04X", zahl);
	}
	public void createNum(){
		NUM.put(Integer.valueOf(34), "\\u0022");
		NUM.put(Integer.valueOf(38), "\u0026");
		NUM.put(Integer.valueOf(39), "\u0027");
		NUM.put(Integer.valueOf(47), "/");
		NUM.put(Integer.valueOf(60), "\u003C");
		NUM.put(Integer.valueOf(62), "\u003E");
		NUM.put(Integer.valueOf(160), "\u00A0");
		NUM.put(Integer.valueOf(161), "\u00A1");
		NUM.put(Integer.valueOf(162), "\u00A2");
		NUM.put(Integer.valueOf(163), "\u00A3");
		NUM.put(Integer.valueOf(164), "\u00A4");
		NUM.put(Integer.valueOf(165), "\u00A5");
		NUM.put(Integer.valueOf(166), "\u00A6");
		NUM.put(Integer.valueOf(167), "\u00A7");
		NUM.put(Integer.valueOf(168), "\u00A8");
		NUM.put(Integer.valueOf(169), "\u00A9");
		NUM.put(Integer.valueOf(170), "\u00AA");
		NUM.put(Integer.valueOf(171), "\u00AB");
		NUM.put(Integer.valueOf(172), "\u00AC");
		NUM.put(Integer.valueOf(173), "\u00AD");
		NUM.put(Integer.valueOf(174), "\u00AE");
		NUM.put(Integer.valueOf(175), "\u00AF");
		NUM.put(Integer.valueOf(176), "\u00B0");
		NUM.put(Integer.valueOf(177), "\u00B1");
		NUM.put(Integer.valueOf(178), "\u00B2");
		NUM.put(Integer.valueOf(179), "\u00B3");
		NUM.put(Integer.valueOf(180), "\u00B4");
		NUM.put(Integer.valueOf(181), "\u00B5");
		NUM.put(Integer.valueOf(182), "\u00B6");
		NUM.put(Integer.valueOf(183), "\u00B7");
		NUM.put(Integer.valueOf(184), "\u00B8");
		NUM.put(Integer.valueOf(185), "\u00B9");
		NUM.put(Integer.valueOf(186), "\u00BA");
		NUM.put(Integer.valueOf(187), "\u00BB");
		NUM.put(Integer.valueOf(188), "\u00BC");
		NUM.put(Integer.valueOf(189), "\u00BD");
		NUM.put(Integer.valueOf(190), "\u00BE");
		NUM.put(Integer.valueOf(191), "\u00BF");
		NUM.put(Integer.valueOf(192), "\u00C0");
		NUM.put(Integer.valueOf(193), "\u00C1");
		NUM.put(Integer.valueOf(194), "\u00C2");
		NUM.put(Integer.valueOf(195), "\u00C3");
		NUM.put(Integer.valueOf(196), "\u00C4");
		NUM.put(Integer.valueOf(197), "\u00C5");
		NUM.put(Integer.valueOf(198), "\u00C6");
		NUM.put(Integer.valueOf(199), "\u00C7");
		NUM.put(Integer.valueOf(200), "\u00C8");
		NUM.put(Integer.valueOf(201), "\u00C9");
		NUM.put(Integer.valueOf(202), "\u00CA");
		NUM.put(Integer.valueOf(203), "\u00CB");
		NUM.put(Integer.valueOf(204), "\u00CC");
		NUM.put(Integer.valueOf(205), "\u00CD");
		NUM.put(Integer.valueOf(206), "\u00CE");
		NUM.put(Integer.valueOf(207), "\u00CF");
		NUM.put(Integer.valueOf(208), "\u00D0");
		NUM.put(Integer.valueOf(209), "\u00D1");
		NUM.put(Integer.valueOf(210), "\u00D2");
		NUM.put(Integer.valueOf(211), "\u00D3");
		NUM.put(Integer.valueOf(212), "\u00D4");
		NUM.put(Integer.valueOf(213), "\u00D5");
		NUM.put(Integer.valueOf(214), "\u00D6");
		NUM.put(Integer.valueOf(215), "\u00D7");
		NUM.put(Integer.valueOf(216), "\u00D8");
		NUM.put(Integer.valueOf(217), "\u00D9");
		NUM.put(Integer.valueOf(218), "\u00DA");
		NUM.put(Integer.valueOf(219), "\u00DB");
		NUM.put(Integer.valueOf(220), "\u00DC");
		NUM.put(Integer.valueOf(221), "\u00DD");
		NUM.put(Integer.valueOf(222), "\u00DE");
		NUM.put(Integer.valueOf(223), "\u00DF");
		NUM.put(Integer.valueOf(224), "\u00E0");
		NUM.put(Integer.valueOf(225), "\u00E1");
		NUM.put(Integer.valueOf(226), "\u00E2");
		NUM.put(Integer.valueOf(227), "\u00E3");
		NUM.put(Integer.valueOf(228), "\u00E4");
		NUM.put(Integer.valueOf(229), "\u00E5");
		NUM.put(Integer.valueOf(230), "\u00E6");
		NUM.put(Integer.valueOf(231), "\u00E7");
		NUM.put(Integer.valueOf(232), "\u00E8");
		NUM.put(Integer.valueOf(233), "\u00E9");
		NUM.put(Integer.valueOf(234), "\u00EA");
		NUM.put(Integer.valueOf(235), "\u00EB");
		NUM.put(Integer.valueOf(236), "\u00EC");
		NUM.put(Integer.valueOf(237), "\u00ED");
		NUM.put(Integer.valueOf(238), "\u00EE");
		NUM.put(Integer.valueOf(239), "\u00EF");
		NUM.put(Integer.valueOf(240), "\u00F0");
		NUM.put(Integer.valueOf(241), "\u00F1");
		NUM.put(Integer.valueOf(242), "\u00F2");
		NUM.put(Integer.valueOf(243), "\u00F3");
		NUM.put(Integer.valueOf(244), "\u00F4");
		NUM.put(Integer.valueOf(245), "\u00F5");
		NUM.put(Integer.valueOf(246), "\u00F6");
		NUM.put(Integer.valueOf(247), "\u00F7");
		NUM.put(Integer.valueOf(248), "\u00F8");
		NUM.put(Integer.valueOf(249), "\u00F9");
		NUM.put(Integer.valueOf(250), "\u00FA");
		NUM.put(Integer.valueOf(251), "\u00FB");
		NUM.put(Integer.valueOf(252), "\u00FC");
		NUM.put(Integer.valueOf(253), "\u00FD");
		NUM.put(Integer.valueOf(254), "\u00FE");
		NUM.put(Integer.valueOf(255), "\u00FF");
		NUM.put(Integer.valueOf(338), "\u0152");
		NUM.put(Integer.valueOf(339), "\u0153");
		NUM.put(Integer.valueOf(352), "\u0160");
		NUM.put(Integer.valueOf(353), "\u0161");
		NUM.put(Integer.valueOf(376), "\u0178");
		NUM.put(Integer.valueOf(402), "\u0192");
		NUM.put(Integer.valueOf(710), "\u02C6");
		NUM.put(Integer.valueOf(732), "\u02DC");
		NUM.put(Integer.valueOf(913), "\u0391");
		NUM.put(Integer.valueOf(914), "\u0392");
		NUM.put(Integer.valueOf(915), "\u0393");
		NUM.put(Integer.valueOf(916), "\u0394");
		NUM.put(Integer.valueOf(917), "\u0395");
		NUM.put(Integer.valueOf(918), "\u0396");
		NUM.put(Integer.valueOf(919), "\u0397");
		NUM.put(Integer.valueOf(920), "\u0398");
		NUM.put(Integer.valueOf(921), "\u0399");
		NUM.put(Integer.valueOf(922), "\u039A");
		NUM.put(Integer.valueOf(923), "\u039B");
		NUM.put(Integer.valueOf(924), "\u039C");
		NUM.put(Integer.valueOf(925), "\u039D");
		NUM.put(Integer.valueOf(926), "\u039E");
		NUM.put(Integer.valueOf(927), "\u039F");
		NUM.put(Integer.valueOf(928), "\u03A0");
		NUM.put(Integer.valueOf(929), "\u03A1");
		NUM.put(Integer.valueOf(931), "\u03A3");
		NUM.put(Integer.valueOf(932), "\u03A4");
		NUM.put(Integer.valueOf(933), "\u03A5");
		NUM.put(Integer.valueOf(934), "\u03A6");
		NUM.put(Integer.valueOf(935), "\u03A7");
		NUM.put(Integer.valueOf(936), "\u03A8");
		NUM.put(Integer.valueOf(937), "\u03A9");
		NUM.put(Integer.valueOf(945), "\u03B1");
		NUM.put(Integer.valueOf(946), "\u03B2");
		NUM.put(Integer.valueOf(947), "\u03B3");
		NUM.put(Integer.valueOf(948), "\u03B4");
		NUM.put(Integer.valueOf(949), "\u03B5");
		NUM.put(Integer.valueOf(950), "\u03B6");
		NUM.put(Integer.valueOf(951), "\u03B7");
		NUM.put(Integer.valueOf(952), "\u03B8");
		NUM.put(Integer.valueOf(953), "\u03B9");
		NUM.put(Integer.valueOf(954), "\u03BA");
		NUM.put(Integer.valueOf(955), "\u03BB");
		NUM.put(Integer.valueOf(956), "\u03BC");
		NUM.put(Integer.valueOf(957), "\u03BD");
		NUM.put(Integer.valueOf(958), "\u03BE");
		NUM.put(Integer.valueOf(959), "\u03BF");
		NUM.put(Integer.valueOf(960), "\u03C0");
		NUM.put(Integer.valueOf(961), "\u03C1");
		NUM.put(Integer.valueOf(962), "\u03C2");
		NUM.put(Integer.valueOf(963), "\u03C3");
		NUM.put(Integer.valueOf(964), "\u03C4");
		NUM.put(Integer.valueOf(965), "\u03C5");
		NUM.put(Integer.valueOf(966), "\u03C6");
		NUM.put(Integer.valueOf(967), "\u03C7");
		NUM.put(Integer.valueOf(968), "\u03C8");
		NUM.put(Integer.valueOf(969), "\u03C9");
		NUM.put(Integer.valueOf(977), "\u03D1");
		NUM.put(Integer.valueOf(978), "\u03D2");
		NUM.put(Integer.valueOf(982), "\u03D6");
		NUM.put(Integer.valueOf(8194), "\u2002");
		NUM.put(Integer.valueOf(8195), "\u2003");
		NUM.put(Integer.valueOf(8201), "\u2009");
		NUM.put(Integer.valueOf(8204), "\u200C");
		NUM.put(Integer.valueOf(8205), "\u200D");
		NUM.put(Integer.valueOf(8206), "\u200E");
		NUM.put(Integer.valueOf(8207), "\u200F");
		NUM.put(Integer.valueOf(8211), "\u2013");
		NUM.put(Integer.valueOf(8212), "\u2014");
		NUM.put(Integer.valueOf(8216), "\u2018");
		NUM.put(Integer.valueOf(8217), "\u2019");
		NUM.put(Integer.valueOf(8218), "\u201A");
		NUM.put(Integer.valueOf(8220), "\u201C");
		NUM.put(Integer.valueOf(8221), "\u201D");
		NUM.put(Integer.valueOf(8222), "\u201E");
		NUM.put(Integer.valueOf(8224), "\u2020");
		NUM.put(Integer.valueOf(8225), "\u2021");
		NUM.put(Integer.valueOf(8226), "\u2022");
		NUM.put(Integer.valueOf(8230), "\u2026");
		NUM.put(Integer.valueOf(8240), "\u2030");
		NUM.put(Integer.valueOf(8242), "\u2032");
		NUM.put(Integer.valueOf(8243), "\u2033");
		NUM.put(Integer.valueOf(8249), "\u2039");
		NUM.put(Integer.valueOf(8250), "\u203A");
		NUM.put(Integer.valueOf(8254), "\u203E");
		NUM.put(Integer.valueOf(8260), "\u2044");
		NUM.put(Integer.valueOf(8364), "\u20AC");
		NUM.put(Integer.valueOf(8465), "\u2111");
		NUM.put(Integer.valueOf(8472), "\u2118");
		NUM.put(Integer.valueOf(8476), "\u211C");
		NUM.put(Integer.valueOf(8482), "\u2122");
		NUM.put(Integer.valueOf(8501), "\u2135");
		NUM.put(Integer.valueOf(8592), "\u2190");
		NUM.put(Integer.valueOf(8593), "\u2191");
		NUM.put(Integer.valueOf(8594), "\u2192");
		NUM.put(Integer.valueOf(8595), "\u2193");
		NUM.put(Integer.valueOf(8596), "\u2194");
		NUM.put(Integer.valueOf(8629), "\u21B5");
		NUM.put(Integer.valueOf(8656), "\u21D0");
		NUM.put(Integer.valueOf(8657), "\u21D1");
		NUM.put(Integer.valueOf(8658), "\u21D2");
		NUM.put(Integer.valueOf(8659), "\u21D3");
		NUM.put(Integer.valueOf(8660), "\u21D4");
		NUM.put(Integer.valueOf(8704), "\u2200");
		NUM.put(Integer.valueOf(8706), "\u2202");
		NUM.put(Integer.valueOf(8707), "\u2203");
		NUM.put(Integer.valueOf(8709), "\u2205");
		NUM.put(Integer.valueOf(8711), "\u2207");
		NUM.put(Integer.valueOf(8712), "\u2208");
		NUM.put(Integer.valueOf(8713), "\u2209");
		NUM.put(Integer.valueOf(8715), "\u220B");
		NUM.put(Integer.valueOf(8719), "\u220F");
		NUM.put(Integer.valueOf(8721), "\u2211");
		NUM.put(Integer.valueOf(8722), "\u2212");
		NUM.put(Integer.valueOf(8727), "\u2217");
		NUM.put(Integer.valueOf(8730), "\u221A");
		NUM.put(Integer.valueOf(8733), "\u221D");
		NUM.put(Integer.valueOf(8734), "\u221E");
		NUM.put(Integer.valueOf(8736), "\u2220");
		NUM.put(Integer.valueOf(8743), "\u2227");
		NUM.put(Integer.valueOf(8744), "\u2228");
		NUM.put(Integer.valueOf(8745), "\u2229");
		NUM.put(Integer.valueOf(8746), "\u222A");
		NUM.put(Integer.valueOf(8747), "\u222B");
		NUM.put(Integer.valueOf(8756), "\u2234");
		NUM.put(Integer.valueOf(8764), "\u223C");
		NUM.put(Integer.valueOf(8773), "\u2245");
		NUM.put(Integer.valueOf(8776), "\u2248");
		NUM.put(Integer.valueOf(8800), "\u2260");
		NUM.put(Integer.valueOf(8801), "\u2261");
		NUM.put(Integer.valueOf(8804), "\u2264");
		NUM.put(Integer.valueOf(8805), "\u2265");
		NUM.put(Integer.valueOf(8834), "\u2282");
		NUM.put(Integer.valueOf(8835), "\u2283");
		NUM.put(Integer.valueOf(8836), "\u2284");
		NUM.put(Integer.valueOf(8838), "\u2286");
		NUM.put(Integer.valueOf(8839), "\u2287");
		NUM.put(Integer.valueOf(8853), "\u2295");
		NUM.put(Integer.valueOf(8855), "\u2297");
		NUM.put(Integer.valueOf(8869), "\u22A5");
		NUM.put(Integer.valueOf(8901), "\u22C5");
		NUM.put(Integer.valueOf(8968), "\u2308");
		NUM.put(Integer.valueOf(8969), "\u2309");
		NUM.put(Integer.valueOf(8970), "\u230A");
		NUM.put(Integer.valueOf(8971), "\u230B");
		NUM.put(Integer.valueOf(9001), "\u2329");
		NUM.put(Integer.valueOf(9002), "\u232A");
		NUM.put(Integer.valueOf(9674), "\u25CA");
		NUM.put(Integer.valueOf(9824), "\u2660");
		NUM.put(Integer.valueOf(9827), "\u2663");
		NUM.put(Integer.valueOf(9829), "\u2665");
		NUM.put(Integer.valueOf(9830), "\u2666");
	}
	public void createStr(){
		STR.put("quot", "\\u0022");
		STR.put("amp", "\u0026");
		STR.put("apos", "\u0027");
		STR.put("lt", "\u003C");
		STR.put("gt", "\u003E");
		STR.put("nbsp", "\u00A0");
		STR.put("iexcl", "\u00A1");
		STR.put("cent", "\u00A2");
		STR.put("pound", "\u00A3");
		STR.put("curren", "\u00A4");
		STR.put("yen", "\u00A5");
		STR.put("brvbar", "\u00A6");
		STR.put("sect", "\u00A7");
		STR.put("uml", "\u00A8");
		STR.put("copy", "\u00A9");
		STR.put("ordf", "\u00AA");
		STR.put("laquo", "\u00AB");
		STR.put("not", "\u00AC");
		STR.put("shy", "\u00AD");
		STR.put("reg", "\u00AE");
		STR.put("macr", "\u00AF");
		STR.put("deg", "\u00B0");
		STR.put("plusmn", "\u00B1");
		STR.put("sup2", "\u00B2");
		STR.put("sup3", "\u00B3");
		STR.put("acute", "\u00B4");
		STR.put("micro", "\u00B5");
		STR.put("para", "\u00B6");
		STR.put("middot", "\u00B7");
		STR.put("cedil", "\u00B8");
		STR.put("sup1", "\u00B9");
		STR.put("ordm", "\u00BA");
		STR.put("raquo", "\u00BB");
		STR.put("frac14", "\u00BC");
		STR.put("frac12", "\u00BD");
		STR.put("frac34", "\u00BE");
		STR.put("iquest", "\u00BF");
		STR.put("Agrave", "\u00C0");
		STR.put("Aacute", "\u00C1");
		STR.put("Acirc", "\u00C2");
		STR.put("Atilde", "\u00C3");
		STR.put("Auml", "\u00C4");
		STR.put("Aring", "\u00C5");
		STR.put("AElig", "\u00C6");
		STR.put("Ccedil", "\u00C7");
		STR.put("Egrave", "\u00C8");
		STR.put("Eacute", "\u00C9");
		STR.put("Ecirc", "\u00CA");
		STR.put("Euml", "\u00CB");
		STR.put("Igrave", "\u00CC");
		STR.put("Iacute", "\u00CD");
		STR.put("Icirc", "\u00CE");
		STR.put("Iuml", "\u00CF");
		STR.put("ETH", "\u00D0");
		STR.put("Ntilde", "\u00D1");
		STR.put("Ograve", "\u00D2");
		STR.put("Oacute", "\u00D3");
		STR.put("Ocirc", "\u00D4");
		STR.put("Otilde", "\u00D5");
		STR.put("Ouml", "\u00D6");
		STR.put("times", "\u00D7");
		STR.put("Oslash", "\u00D8");
		STR.put("Ugrave", "\u00D9");
		STR.put("Uacute", "\u00DA");
		STR.put("Ucirc", "\u00DB");
		STR.put("Uuml", "\u00DC");
		STR.put("Yacute", "\u00DD");
		STR.put("THORN", "\u00DE");
		STR.put("szlig", "\u00DF");
		STR.put("agrave", "\u00E0");
		STR.put("aacute", "\u00E1");
		STR.put("acirc", "\u00E2");
		STR.put("atilde", "\u00E3");
		STR.put("auml", "\u00E4");
		STR.put("aring", "\u00E5");
		STR.put("aelig", "\u00E6");
		STR.put("ccedil", "\u00E7");
		STR.put("egrave", "\u00E8");
		STR.put("eacute", "\u00E9");
		STR.put("ecirc", "\u00EA");
		STR.put("euml", "\u00EB");
		STR.put("igrave", "\u00EC");
		STR.put("iacute", "\u00ED");
		STR.put("icirc", "\u00EE");
		STR.put("iuml", "\u00EF");
		STR.put("eth", "\u00F0");
		STR.put("ntilde", "\u00F1");
		STR.put("ograve", "\u00F2");
		STR.put("oacute", "\u00F3");
		STR.put("ocirc", "\u00F4");
		STR.put("otilde", "\u00F5");
		STR.put("ouml", "\u00F6");
		STR.put("divide", "\u00F7");
		STR.put("oslash", "\u00F8");
		STR.put("ugrave", "\u00F9");
		STR.put("uacute", "\u00FA");
		STR.put("ucirc", "\u00FB");
		STR.put("uuml", "\u00FC");
		STR.put("yacute", "\u00FD");
		STR.put("thorn", "\u00FE");
		STR.put("yuml", "\u00FF");
		STR.put("OElig", "\u0152");
		STR.put("oelig", "\u0153");
		STR.put("Scaron", "\u0160");
		STR.put("scaron", "\u0161");
		STR.put("Yuml", "\u0178");
		STR.put("fnof", "\u0192");
		STR.put("circ", "\u02C6");
		STR.put("tilde", "\u02DC");
		STR.put("Alpha", "\u0391");
		STR.put("Beta", "\u0392");
		STR.put("Gamma", "\u0393");
		STR.put("Delta", "\u0394");
		STR.put("Epsilon", "\u0395");
		STR.put("Zeta", "\u0396");
		STR.put("Eta", "\u0397");
		STR.put("Theta", "\u0398");
		STR.put("Iota", "\u0399");
		STR.put("Kappa", "\u039A");
		STR.put("Lambda", "\u039B");
		STR.put("Mu", "\u039C");
		STR.put("Nu", "\u039D");
		STR.put("Xi", "\u039E");
		STR.put("Omicron", "\u039F");
		STR.put("Pi", "\u03A0");
		STR.put("Rho", "\u03A1");
		STR.put("Sigma", "\u03A3");
		STR.put("Tau", "\u03A4");
		STR.put("Upsilon", "\u03A5");
		STR.put("Phi", "\u03A6");
		STR.put("Chi", "\u03A7");
		STR.put("Psi", "\u03A8");
		STR.put("Omega", "\u03A9");
		STR.put("alpha", "\u03B1");
		STR.put("beta", "\u03B2");
		STR.put("gamma", "\u03B3");
		STR.put("delta", "\u03B4");
		STR.put("epsilon", "\u03B5");
		STR.put("zeta", "\u03B6");
		STR.put("eta", "\u03B7");
		STR.put("theta", "\u03B8");
		STR.put("iota", "\u03B9");
		STR.put("kappa", "\u03BA");
		STR.put("lambda", "\u03BB");
		STR.put("mu", "\u03BC");
		STR.put("nu", "\u03BD");
		STR.put("xi", "\u03BE");
		STR.put("omicron", "\u03BF");
		STR.put("pi", "\u03C0");
		STR.put("rho", "\u03C1");
		STR.put("sigmaf", "\u03C2");
		STR.put("sigma", "\u03C3");
		STR.put("tau", "\u03C4");
		STR.put("upsilon", "\u03C5");
		STR.put("phi", "\u03C6");
		STR.put("chi", "\u03C7");
		STR.put("psi", "\u03C8");
		STR.put("omega", "\u03C9");
		STR.put("thetasym", "\u03D1");
		STR.put("upish", "\u03D2");
		STR.put("piv", "\u03D6");
		STR.put("ensp", "\u2002");
		STR.put("emsp", "\u2003");
		STR.put("thinsp", "\u2009");
		STR.put("zwnj", "\u200C");
		STR.put("zwj", "\u200D");
		STR.put("lrm", "\u200E");
		STR.put("rlm", "\u200F");
		STR.put("ndash", "\u2013");
		STR.put("mdash", "\u2014");
		STR.put("lsquo", "\u2018");
		STR.put("rsquo", "\u2019");
		STR.put("sbquo", "\u201A");
		STR.put("ldquo", "\u201C");
		STR.put("rdquo", "\u201D");
		STR.put("bdquo", "\u201E");
		STR.put("dagger", "\u2020");
		STR.put("Dagger", "\u2021");
		STR.put("bull", "\u2022");
		STR.put("hellip", "\u2026");
		STR.put("permil", "\u2030");
		STR.put("prime", "\u2032");
		STR.put("Prime", "\u2033");
		STR.put("lsaquo", "\u2039");
		STR.put("rsaquo", "\u203A");
		STR.put("oline", "\u203E");
		STR.put("frasl", "\u2044");
		STR.put("euro", "\u20AC");
		STR.put("image", "\u2111");
		STR.put("weierp", "\u2118");
		STR.put("real", "\u211C");
		STR.put("trade", "\u2122");
		STR.put("alefsym", "\u2135");
		STR.put("larr", "\u2190");
		STR.put("uarr", "\u2191");
		STR.put("rarr", "\u2192");
		STR.put("darr", "\u2193");
		STR.put("harr", "\u2194");
		STR.put("crarr", "\u21B5");
		STR.put("lArr", "\u21D0");
		STR.put("uArr", "\u21D1");
		STR.put("rArr", "\u21D2");
		STR.put("dArr", "\u21D3");
		STR.put("hArr", "\u21D4");
		STR.put("forall", "\u2200");
		STR.put("part", "\u2202");
		STR.put("exist", "\u2203");
		STR.put("empty", "\u2205");
		STR.put("nabla", "\u2207");
		STR.put("isin", "\u2208");
		STR.put("notin", "\u2209");
		STR.put("ni", "\u220B");
		STR.put("prod", "\u220F");
		STR.put("sum", "\u2211");
		STR.put("minus", "\u2212");
		STR.put("lowast", "\u2217");
		STR.put("radic", "\u221A");
		STR.put("prop", "\u221D");
		STR.put("infin", "\u221E");
		STR.put("ang", "\u2220");
		STR.put("and", "\u2227");
		STR.put("or", "\u2228");
		STR.put("cap", "\u2229");
		STR.put("cup", "\u222A");
		STR.put("int", "\u222B");
		STR.put("there4", "\u2234");
		STR.put("sim", "\u223C");
		STR.put("cong", "\u2245");
		STR.put("asymp", "\u2248");
		STR.put("ne", "\u2260");
		STR.put("equiv", "\u2261");
		STR.put("le", "\u2264");
		STR.put("ge", "\u2265");
		STR.put("sub", "\u2282");
		STR.put("sup", "\u2283");
		STR.put("nsub", "\u2284");
		STR.put("sube", "\u2286");
		STR.put("supe", "\u2287");
		STR.put("oplus", "\u2295");
		STR.put("otimes", "\u2297");
		STR.put("perp", "\u22A5");
		STR.put("sdot", "\u22C5");
		STR.put("lceil", "\u2308");
		STR.put("rceil", "\u2309");
		STR.put("lfloor", "\u230A");
		STR.put("rfloor", "\u230B");
		STR.put("lang", "\u2329");
		STR.put("rang", "\u232A");
		STR.put("loz", "\u25CA");
		STR.put("spades", "\u2660");
		STR.put("clubs", "\u2663");
		STR.put("hearts", "\u2665");
		STR.put("diams", "\u2666");
	}
}
